import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import './assets/css/flex.css';
import Fragment from 'vue-fragment';
import axios from 'axios';
import permissions from './permissions/index';
import './filter/index';
// import './icons' // icon
// // 导入全局样式表
import pdf from '../src/views/pdfgile/index'
import htmlToPdf from '../src/views/pdfgile/htmlToPdf'
import Print1 from '../src/views/pdfgile/print'

import Print from 'vue-print-nb'

// import Print from 'vue-print-nb'


// import Blob from '../src/views/vendor/Blod'
// import Export2Excel from './views/vendor/Export2Excel'
// Vue.use(Blob)
// Vue.use(Export2Excel)
Vue.use(Print1)
Vue.use(Print)
Vue.use(pdf)
Vue.use(htmlToPdf)
import './assets/css/global.css'
Vue.config.productionTip = false
Vue.use(ElementUI);
Vue.use(Fragment.Plugin);
Vue.prototype.$http = axios;
Vue.prototype.hasPerm = permissions;
// axios.defaults.baseURL=""
axios.interceptors.request.use(config => {
  //解决spring security 不能获取到用户名和密码，验证码的问题
  if (config.url.indexOf('/api/user/login') != -1) {
    config.headers['Content-Type'] = 'multipart/form-data';
  } else {
    config.headers['Content-Type'] = 'application/json';
  }
  // 为请求头添加token字段
  config.headers.token = sessionStorage.getItem('token')
  return config
})


// 接口数据返回时，如果后台返回token过期，那么需要重新登录
// 响应拦截器
axios.interceptors.response.use(response => {
  console.log(response);
  if (response.headers.token) {

    sessionStorage.setItem("token", response.headers.token);

  }
  // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
  // 否则的话抛出错误
  if (response.status === 200) {
    if (response.data.code == 600) {
      sessionStorage.clear();
      window.location.href = '/tologin';
      return response;
    } else {
      return Promise.resolve(response);
    }
  } else {
    return Promise.reject(response);
  }
},
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
  // 下面列举几个常见的操作，其他需求可自行扩展
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
          break;
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 405:
          ElementUI.Message({
            message: '请求方式错误',
            type: 'error'
          });
          break;
        // 404请求不存在
        case 404:
          ElementUI.Message({
            message: '网络请求不存在',
            type: 'error'
          });
          break;
        // 其他错误，直接抛出错误提示
        default:
          ElementUI.Message({
            message: error.response.data.msg,
            type: 'error'
          });
          if (error.response.data.code == 600) {
            sessionStorage.clear();
            window.location.href = '/tologin';
          }
      }
      return Promise.reject(error.response);
    }
  }
);


//添加路由拦截
router.beforeEach((to, from, next) => {
  //to即将进入的路由
  //from即将离开的路由
  store.commit('getTabs');
  store.commit('setActiveTabs', to.name);
  //如果store中的菜单数据menu_data被刷新了，那么从新加载
  //从sessionStorage中获得数据
  let menuData = sessionStorage.getItem('menuList');
  //如果访问路为登录
  if (to.path === '/tologin') {
    //如果有数据
    if (menuData) {
      //跳到首页
      next({ path: '/home' })
    } else {
      next();
    }
  } else {
    //如果没有数据，路由不等于login
    if (!menuData && to.name !== 'tologin') {
      next({ path: '/tologin' });
    } else {
      if (store.state.MenuStore.menu_data.length == 0) {
        store.commit('getMenuList', router);
        next({ path: to.path })
      } else {
        //next断续往下执行 
        next();
      }
    }
  }

})


new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
